perm filename EXIAL.FAI[IAL,BGB] blob
sn#145887 filedate 1975-02-18 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00014 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE EXIAL - EXPERIMENTAL INCREMENTAL ASSEMBLY LANGAUAGE.
C00003 00003 TEST
C00005 00004 GETCHW,MKNODE,KLNODE,INIT
C00007 00005 SUBR(EDDPY,CURCHR)
C00009 00006 SUBR(EDSYS,CHAR) INVOKE THE SYSTEM LINE EDITOR.
C00014 00007 SUBR(EDTEXT)
C00016 00008 EDTEXT - COMMAND TABLES
C00019 00009 MOVE CURSOR
C00020 00010 DELETE
C00022 00011 LINED
C00024 00012 INSLIN: NLINK N,N
C00026 00013 SUBR(LOOKUP,KEY)
C00027 00014
C00028 ENDMK
C⊗;
TITLE EXIAL - EXPERIMENTAL INCREMENTAL ASSEMBLY LANGAUAGE.
COMMENT *
STANFORD UNIVERSITY - BRUCE G. BAUMGART - FEBRUARY 1975.
TEXT EDITOR - INCREMENTAL ASSEMBER - LOADER - DEBUGGER.
LIST PROCESSOR - MEMORY MANAGEMENT - ARITHMETIC & TRIG.
DISPLAY ROUTINES - MEMORY MANAGEMENT
*
.INSERT MN
EXTERN DPYBUF,AIVECT,DPYOUT,DPYBIG,DPYSET,DTYO,DPYSTR,DPYPTR,RIVECT,DPYBRT
LEFT(NLINK,0)↔RIGHT(PLINK,0)
NODSIZ ←← =16 ;WORDS PER NODE.
NODCNT ←← =100 ;NODE COUNT.
MEM: BLOCK NODCNT * NODSIZ
AVAIL: 0
CLRLIN: BLOCK 2
EDBUF: BLOCK =21
EDBFLN←←.-EDBUF
INTEGER META,CTRL
;TEST
PATCH: BLOCK 100
PDL: BLOCK 100
SA: CALLI
LAC P,[IOWD 20,PDL]
CALL(INIT)
DPYPOS -=400↔DPYSIZ 2002
CALL(EDTEXT)
EXIT
NODE0: N1
NODE1: N1
N1: XWD 0,N2↔ ASCIZ/LINE 1 - SHIT.../↔ ORG N1+NODSIZ
N2: XWD N1,N3↔ ASCIZ/LINE 2 - FUCK.../↔ ORG N2+NODSIZ
N3: XWD N2,N4↔ ASCIZ/LINE 3 - BASTARD/↔ ORG N3+NODSIZ
N4: XWD N3,N5↔ ASCIZ/LINE 4 - BITCH/↔ ORG N4+NODSIZ
N5: XWD N4,N6↔ ASCIZ/LINE 5......../↔ ORG N5+NODSIZ
N6: XWD N5,N7↔ ASCIZ/LINE 6......../↔ ORG N6+NODSIZ
N7: XWD N6,N8↔ ASCIZ/LINE 7......../↔ ORG N7+NODSIZ
N8: XWD N7,N9↔ ASCIZ/LINE 8......../↔ ORG N8+NODSIZ
N9: XWD N8, 0↔ ASCIZ/LINE 9......../↔ ORG N9+NODSIZ
;GETCHW,MKNODE,KLNODE,INIT
GETCHW: INCHRW 1↔POPJ 17,
SUBR(MKNODE)
COMMENT .-----------------------------------------------------------.
SKIPN 1,AVAIL↔GO[FATAL(NODE MEMORY FULL)]
LAC(1)↔DAC AVAIL↔SETZM(1)↔POP0J
ENDR MKNODE;2/10/75(BGB)--------------------------------------------.
SUBR(KLNODE,NODE)
COMMENT .-----------------------------------------------------------.
CDR 1,NODE↔LAC 1↔DIP↔AOS ;CLEAR THE NODE.
SETZM(1)↔BLT NODSIZ-1(1)
EXCH 1,AVAIL↔MOVEM 1,@AVAIL ;PUT NODE ON AVAIL LIST.
POP1J
ENDR KLNODE;2/10/75(BGB)--------------------------------------------.
SUBR(INIT)
COMMENT .-----------------------------------------------------------.
LAC [XWD MEM,MEM+1]↔SETZM MEM↔BLT MEM+NODCNT*NODSIZ-1 ;CLEAR MEM.
MOVEI 1,MEM↔DAC 1,AVAIL ;INIT AVAIL.
DIP 1,1↔ADD 1,[XWD NODSIZ,0]↔MOVEI NODCNT-1 ;INIT LOOP.
L1: HLRZM 1,(1)↔ADD 1,[XWD NODSIZ,NODSIZ]↔SOJG L1 ;LOOP.
POP0J
ENDR INIT;2/10/75(BGB)----------------------------------------------.
SUBR(KLTEXT,NODE)
COMMENT .-----------------------------------------------------------.
SETZ↔CDR 2,NODE
CAR 1,(2)↔CDR 3,(2)
DIP 1,(3)↔DAP 3,(1)
SKIPN 1↔DAC 3,NODE0
CALL(KLNODE,2)
LAC 1,3↔POP1J
ENDR KLTEXT;2/12/75(BGB)--------------------------------------------.
SUBR(EDDPY,CURCHR)
COMMENT .-----------------------------------------------------------.
N←4
;INITIALIZE DISPLAY FOR GLASS 17
CALL(DPYSET,DPYBUF)↔CALL(DPYBIG,[2])↔CALL(DPYBRT,[2])
CALL(AIVECT,[-777],[=460])
CALL(DPYSTR,[[ASCIZ/*****************/]])↔JSR DPCRLF
SETZM CURFLG#↔SETZM CUR#
;DISPLAY ALL THE LINES
SKIPN N,NODE0↔GO L2 ;FIRST LINE
L1: CAMN N,NODE1↔JSR DPYCUR
MOVEI 1(N)↔CALL(DPYSTR,0)↔JSR DPCRLF ;DISPLAY LINE OF TEXT.
PLINK N,N↔JUMPN N,L1
;DISPLAY LAST LINE.
L2: SKIPN CUR↔JSR DPYCUR
CALL(DPYSTR,[[ASCIZ/*****************/]])↔JSR DPCRLF
CALL(DPYOUT,[17])↔POP1J
;.......................................
DPYCUR: 0↔CALL(RIVECT,[-15],[0]) ;DISPLAY LINE CURSOR.
CDR 1,DPYPTR
DAC 1,CLRLIN
SETOM CURFLG↔SETOM CUR↔CALL(DTYO,CURCHR)
CALL(DPYSTR,<[[BYTE(7) " ",15,0]]>)
GO @DPYCUR
;.......................................
DPCRLF: 0↔SKIPN CURFLG↔GO DPCRL2
SETZM CURFLG
MOVSI 1,700
HLLM 1,DPYPTR
HRLZ 1,DPYPTR
ADD 1,[XWD 1,20]
DAC 1,CLRLIN+1
DPCRL2: CALL(DPYSTR,[[ASCIZ/
/]])↔ GO @DPCRLF
ENDR EDDPY;4-MAY-73(TVR)_____________________________________________
SUBR(EDSYS,CHAR) ;INVOKE THE SYSTEM LINE EDITOR.
COMMENT .----------------------------------------------------------.
ACCUMULATORS{N,C1,C2,P1,P2}
;PUT TEXT INTO LINE BUFFER.
LAC N,NODE1↔HRLI 1(N)↔HRRI EDBUF↔BLT EDBUF+NODSIZ-2
PTLOAD[0↔EDBUF] ;WORRY ABOUT TYPE AHEAD.
LAC 1,CHAR↔SETZ↔PTWR1W
LAC 1,CLRLIN+1↔PGSEL 17
SKIPE CLRLIN↔UPGMVM 1,@CLRLIN
;HOW MANY LINES FROM THE TOP.
MOVEI C1,1↔LAC 1,NODE1
NLINK 1,1↔SKIPE 1↔AOJA C1,.-2
IMULI C1,-30 ;POSITION THE LINE EDITOR.
ADDI C1,=460↔LEYPOS (C1)
INWAIT↔CALL(SETEXT,[EDGET])
LEYPOS↔LAC 1,BRKCHR↔POP1J
;.......................................
EDGET: INCHSL 1↔POPJ P,
CAIE 1,12↔CAIL 1,200↔GO[DAC 1,BRKCHR↔GO EDGET]
CAIN 1,15↔GO [INCHSL 1↔JFCL↔DAC 1,BRKCHR↔POPJ P,]
CAIN 1,175↔GO BLAST↔AOS (P)↔POPJ P,
;.......................................
BLAST: SUB P,[XWD 2,2]↔LEYPOS ;ALT MODE TO RESTORE LINE.
INCHSL 1↔GO .+5
CAIE 1,15↔GO .-3
INCHSL 1↔JFCL
LAC P2,[POINT 7,EDBUF]
CALL(SETEXT,[ILDB 1,P2↔POPJ P,])
SETZ 1,↔POP1J
;.......................................
INTEGER BRKCHR,FOOFLG
ENDR EDSYS;4-MAY-73(TVR)_____________________________________________
SUBR(EDTEXT)
COMMENT .-----------------------------------------------------------.
ACCUMULATORS{T1,T2,T3,CNT,SGN,CHR,N}
SKIPA N,NODE1
L0: POP P,0↔SETZ CHR,
L1: CALL(EDDPY,["→"])
SETZB CNT,SGN
SKIPN CHR
L2: GO[CALL(GETCHW)↔LAC CHR,1↔GO .+1]
CAIN CHR,15↔GO L2
LDB 1,[POINT 2,CHR,35-7] ;CONTROL BITS.
LAC T1,CTABS(1)
LAC T2,CHR↔ANDI T2,177 ;7-BIT ASCII
;ACCUMULATE ITERATION NUMBER.
CAIL T2,"0"↔CAIL T2,"9"↔GO .+3
TRNE CHR,200↔GO[IMULI CNT,=10
ADDI CNT,-"0"(T2)↔GO L2]
CAIL T2,"a"↔CAILE T2,"z"↔GO L3↔SUBI T2,40 ;CONVERT TO UPPER CASE.
L3: CAR 0,(T1)↔CAIE 0,(T2)↔AOBJN T1,L3
CAIE 0,(T2)↔GO[TRNN CHR,200↔GO LINED
UNKNOWN: OUTSTR[ASCIZ/Unknown command: /]
TRNE CHR,200↔OUTSTR[ASCIZ/<control>/]
TRNE CHR,400↔OUTSTR[ASCIZ/<meta>/]
OUTCHR CHR↔GO L0+1]
CDR T2,(T1)↔PUSHJ P,(T2)↔GO L1↔GO L2 ;COMMAND DISPATCH.
;.......................................
;EDTEXT - COMMAND TABLES
;--------------------------------------------------------------------
CTABS: XWD -CLEN0,CTAB0 ; λ
XWD -CLEN1,CTAB1 ; α
XWD -CLEN2,CTAB2 ; β
XWD -CLEN3,CTAB3 ; ε
;PLAIN---------------------------------------------------------------
CTAB0: XWD 12,[MOVEI 1↔GO MOVER] ;LF
XWD 177,[MOVNI 1↔GO MOVER] ;BS
XWD 13,[MOVNI 1↔GO MOVER] ;VT
XWD 175,L0 ;ALT
CLEN0←←.-CTAB0
;CTRL---COMMANDS TO SYSTEM LINE EDITOR ------------------------------
CTAB1: XWD "D",LINED ;αD DELETE
XWD "I",LINED ;αI INSERT
XWD "K",LINED ;αK KILL TO DELIMITER
XWD "S",LINED ;αS SCAN
XWD 9,LINED ;αTAB
XWD 40,LINED ;αSPACE
XWD 12,[MOVEI 1↔GO MOVER] ;αLF
;META/CTRL-----------------------------------------------------------
CTAB3: XWD 13,[MOVNI 1↔GO MOVER] ;VT
XWD "<",[MOVNI 4↔GO MOVER]
XWD ">",[MOVEI 4↔GO MOVER]
XWD "≤",[MOVNI 16↔GO MOVER]
XWD "≥",[MOVEI 16↔GO MOVER]
XWD "↑",[MOVNI 1↔MOVEI CHR,211↔GO MOVER2]
XWD "↓",[MOVEI 1↔MOVEI CHR,211↔GO MOVER2]
XWD "Q",[SOSG N↔GO L0↔SETZ CHR,↔CALL(EDSYS+1,N,CHR)↔POPJ P,]
XWD "Z",JOIN
XWD "+",[MOVEI SGN,1↔AOS(P)↔POPJ P,]
XWD "-",[SKIPN SGN↔MOVEI SGN,1↔MOVN SGN,SGN↔AOS(P)↔POPJ P,]
XWD "E",[EDEXIT: PGIOT 2,↔POP P,0↔POP1J]
CLEN1←←.-CTAB1
XWD 12,INSLIN ; εCR
XWD "I",INSLIN ; εI
XWD "D",DELLIN ; εD
CLEN3←←.-CTAB3
;META----------------------------------------------------------------
CTAB2: XWD 12,UNKNOWN
CLEN2←←.-CTAB2
;MOVE CURSOR
;--------------------------------------------------------------------
MOVER: SETZ CHR,
LAC N,NODE1
MOVER2: SKIPN CNT↔MOVEI CNT,1 ;DEFAULT ITERATION = 1
IMUL CNT,0
SKIPGE SGN↔MOVNS CNT ;SIGN OF ITERATION.
JUMPL CNT,BACK
FORWRD: PLINK N,N
JUMPE N,.+3
DAC N,NODE1
SOJG CNT,FORWRD
POPJ P,
BACK: NLINK N,N
JUMPE N,.+3
DAC N,NODE1
AOJL CNT,BACK
POPJ P,
;--------------------------------------------------------------------
;DELETE
DELLIN: LAC N,NODE1
SKIPN CNT↔MOVEI CNT,1 ;DEFAULT ITERATION = 1
JUMPL SGN,DBACK
DFORE: SETQ(NODE1,{KLTEXT,NODE1}) ;DELETE FORWARDS.
JUMPE N,L0
SOJG CNT,DFORE
GO L0
DBACK: NLINK N,N ;DELETE BACKWARDS.
JUMPE N,L0
SETQ(NODE1,{KLTEXT,NODE1})
SOJG CNT,DBACK
JUMPE N,L0
JOIN: ;CALL(NXTLIN,N)
JUMPE 1,L0
; TCW 1,1
; MARK 1,CONBIT
GO L0
;LINED
LINED: LAC N,NODE1
PLINK 1,N↔JUMPE 1,[CALL(INSTXT)↔GO LINED]
CALL(EDSYS,CHR)
DAC 1,CHR↔POPJ P,
;--------------------------------------------------------------------
INSLIN: NLINK N,N
JUMPG CNT,INSLI2
NEWTXT: CALL(INSTXT)
CALL(EDDPY,["↔"])
SETZM CLRLIN
CALL(EDSYS,[0])
CAIN 1,12↔GO NEWTXT
GO L0
INSLI2: CALL(INSTXT)↔SOJG CNT,.-1
NLINK N,N↔GO L0
ENDR EDTEXT;2/11/75(BGB)---------------------------------------------
SUBR(INSTXT) ;INSERT NEW TEXT NODE AFTER NODE1
COMMENT .-----------------------------------------------------------.
CALL(MKNODE)
SETZ↔LAC 2,NODE1↔CDR 3,(2)
DIP 2,(1)↔DAP 1,(2) ;RING IN
DAP 3,(1)↔DIP 1,(3)↔DAC 1,NODE1
POP0J
ENDR INSTXT;2/10/75(BGB)--------------------------------------------.
SUBR(SETEXT,PROCED)
COMMENT .-----------------------------------------------------------.
CDR 2,NODE1↔HRLI 2,700 ;BYTE POINTER INTO NODE.
L1: PUSHJ P,@PROCED↔GO L2 ;EQUIVALENT TO INCHWL 1
CAIE 12↔CAIN 175↔GO L2
IDPB 1,2↔GO L1
L2: SETZ 1,↔IDPB 1,2↔POP1J] ;TERMINATION ON LF OR ALT.
ENDR SETEXT;2/10/75(BGB)--------------------------------------------.
SUBR(LOOKUP,KEY)
COMMENT .-----------------------------------------------------------.
ACCUMULATORS{PTR,LO,HI}
LAC KEY↔SETZ 1, ;INITIALIZATION
MOVEI LO,ORGTAB↔MOVEI HI,ENDTAB
L1: CAMGE HI,LO↔POP1J ;TEST FOR END
LAC PTR,LO↔ADD PTR,HI↔ASH PTR,-1 ;PTR ← (LO+HI)/2
CAMGE (PTR)↔GO[MOVEI PTR,-2(HI)↔GO L1] ;KEY < TABLE(PTR)
CAME (PTR)↔GO[MOVEI PTR, 2(LO)↔GO L1] ;KEY > TABLE(PTR)
LAC 1,1(PTR)↔POP1J ;KEY = TABLE(PTR)
ENDR LOOKUP;---------------------------------------------------------
END SA